﻿#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010, M = 3000000;//2^31,每个数都可以看作是31位长的二进制数，
//也就是每个数最多31位长度，最大10 0000 个数，节点个数：300 0000左右

int son[M][2], idx; //M位（每一个都要插入在树的节点）
int a[N];//a[M]; N个数

/*Trie树插入的节点是[p][0/1]
有该节点插入到树内
构成的是一颗0 1节点组成的Trie树*/
void insert(int x)
{
    int p = 0;
    //i=30,从最高位开始
    for (int i = 30; ~i; i--)//~i取反i与i>=0一个效果，当i=-1时，-1二进制表示全1，~1:全0
    {
        int& s = son[p][x >> i & 1];
        if (!s)  s = ++idx;
        p = s;
    }
}
int query(int x)
{
    int res = 0, p = 0;
    for (int i = 30; ~i; i--)
    {
        int s = x >> i & 1;//当前位是0还是1
        //if(!son[p][s])  return 0;
        if (son[p][!s]) //如果当前层有对应的不相同的数
        {
            res += 1 << i;//1<<i:当前i多少位，贡献多少，就0-i路上的所有节点先贡献出来。
            p = son[p][!s];//p=son[p][s];
            //res=res*2+1; *2相当左移一位  res = res<<1 + 1 是错的，因为<<的优先级比+要小
        }
        else    p = son[p][s];//res=res*2+0; 
    }
    return res;//res 是用来记录和当前 x 异或后结果的最大值
}
/*1<<i表示将1的二进制每位想左移动i位，末位补0。
如：1<<5
由于1的二进制为0000 0001，左移5位就是将每位向左移动5位，
末位补0，所以1<<5后结果为0010 0000，转换为十进制就是32。*/
int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        insert(a[i]);//insert(a);不对，是把每一个数分别插入在树内
    }
    int res = 0;
    for (int i = 0; i < n; i++)    res = max(res, query(a[i])); //只用查找每一位就行
    //还不能把insert()和query()写在一个循环内，必须先 后
    cout << res << endl;
    return 0;
}

//暴力
#include<iostream>
using namespace std;
const int N = 100010;

int n;
int a[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)    cin >> a[i];
    int res = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            res = max(res, a[i] ^ a[j]);
    cout << res << endl;
    return 0;
}
/*err:
1.在query()内，
if(son[q][!(x>>i&1)])
{ ...
      q=son[q][!(x>>i&1)];
}
 //q=q=son[q][x>>i&1]; 不是直接走，而是不同情况走不同的路，else不能忘了
else    q=son[q][x>>i&1];
2.for(..){
       //cout<<query(a[i])<<endl;
        res=max(res,query(a[i]));
 }
 cout<<res<<endl;
 不是循环输出每一个查询结果，在query()内计算的是每一个数与该数的最大异或结果，但是res要在这些异或结果内再挑出最大的
 
 3.res不能作为全局变量
 int res;
 query(){ res=0;..}
 main(){ res=0;..}这样也不对，
 不然每次主函数调用计算一次，在query()函数内。。这个我还没想的太清楚
 反正最好少设置全局变量。
 */

